'''
Created on 08/06/2011

@author: dolalima
'''
import socket
import time
#import sys
from classes.Cartao import Cartao
from classes.Comercio import Comercio
from classes.Endereco import Endereco
from classes.Transacao import Transacao
from classes.ArvoreCartao import ArvoreCartao
from classes.ArvoreComercio import ArvoreComercio
from classes.arvore import NodeVisitor
from classes.Nodo import *
v = NodeVisitor ()

class Server():
    
    
    
    def __init__(self,host="",port=2000):
        
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.bind((host,port))
        
        self.__bancoCartao = ArvoreCartao()
        self.__bancoComercio = ArvoreComercio()
        
    def getBancoCartao(self):
        return self.__bancoCartao    
    
    def getBancoComercio(self):
        return self.__bancoComercio
    
    def getHora(self):
        hora =  time.strftime("%H:%M")
        return hora
    
    def getHoraDecimal(self):
        hora=self.getHora()
        hora = hora.split(":")
        H=int(hora[0]) 
        M =  int(hora[1])/60. 
        return H+M
    
    def Convert_Hora_to_Hora_Decimal(self,hora):
        hora = hora.split(":")
        H=int(hora[0]) 
        M =  int(hora[1])/60. 
        return H+M
          

    def escutar(self):
        msg=""
        while msg!="Sair":
            self.server.listen(1)
            conn, endereco = self.server.accept()
            print "cliente: ", endereco
            

            while True:
                dados = conn.recv(1024)
                if dados != "":
                    print dados," ",time.asctime()
                    transacao = Transacao()
                    transacao.setFromString(dados)
                    transacao = self.CheckTransacao(transacao)
                    conn.send(transacao.getDataString())

        print "Conecxao Encerrada."
        
        conn.close()
        
    def CarregaDadosCartao(self):
        print "Carregando dados de Cartoes. \n"
        file = open("dados/cartao.txt","r")
        linha = file.readline()
        while linha!="":
            linha=linha.replace("\n","")
            dados=linha.split("|")
            cartao= Nodo()
            print "Colocando " + dados[0]
            cartao.set_dado(Cartao(int(dados[0]),dados[1],dados[2],float(dados[3]),float(dados[4])))
            self.__bancoCartao.inserir(cartao)
            
            linha = file.readline()
            self.__bancoCartao.inorderClass()
            print "___________________________\n"
        
        print "Dados de Cartos Carregados. \n"
      
    def CarregaDadosComercio(self):
        print "Carregando dados de Comercio. \n"
        file = open("dados/comercio.txt")
        linha = file.readline()
        while linha!="":
            linha = linha.replace("\n","")
            dados_1 = linha.split("|")
            linha = file.readline()
            linha = linha.replace("\n","")
            dados_2 = linha.split("|")
            endereco = Endereco(dados_2[0],dados_2[1],dados_2[2],dados_2[3],dados_2[4])
            nodo=Nodo()
            nodo.set_dado(Comercio(int(dados_1[0]),dados_1[1],endereco,(dados_1[2],dados_1[3]),dados_1[4],dados_1[5]))
            
            self.__bancoComercio.inserir(nodo)
            
            linha= file.readline()
            
        print "Dados de Comercio Carregados. \n"
        
    def CheckTransacao(self,transacao):
        comercio= self.__bancoComercio.pesquisar(None, transacao.getComercioCodigo()).dado()
        
        if comercio.getCodigo() == transacao.getComercioCodigo():
            cartao = self.__bancoCartao.pesquisar(None, transacao.getCartaoCodigo()).dado()
            if cartao.getNumero() == transacao.getCartaoCodigo():
                hora=self.getHoraDecimal()
                if comercio.getHorario_InicialDecimal()>= hora and hora <= comercio.getHorario_FinalDecimal():
                    if transacao.getValor() <= cartao.getLimiteDisponivel():
                        cartao.EfetuarTransacao(transacao.getValor())
                        comercio.AcidionaTransacao(transacao.getValor())
                        transacao.setMenssagem("\nTransacao Aceita\n")
                        return transacao
                    else:
                        transacao.setMenssagem("\nSem limite disponivel\n")
                        return transacao
                else:
                    transacao.setMenssagem("\nComercio fora do horario de Funcionamento\n")
                    return transacao
            else:
                transacao.setMenssagem("\nCartao invalido\n")
                return transacao
        else:
            transacao.setMenssagem("\nComercio nao Cadastrado\n")
            return transacao

    def findCartao (self,key):
        result = None
        if (key == self.__val.getNumero()):
            result = self
        elif (key < self.__val.getNumero()):
            if (self.__esquerdo  <> None ):
                result = self.__esquerdo. findCartao (key)
        else :
            if (self.__direito <> None ):
                result = self.__direito. findCartao (key)
        return result
    
    def findComercio (self,key):
        result = None
        if (key == self.__val.getCodigo()):
            result = self
        elif (key < self.__val.getCodigo()):
            if (self.__esquerdo  <> None ):
                result = self.__esquerdo. findComercio (key)
        else :
            if (self.__direito <> None ):
                result = self.__direito. findComercio (key)
        return result 
    
if __name__ == '__main__':
    server=Server()
    server.CarregaDadosCartao()
    server.CarregaDadosComercio()
    server.escutar()
